import mongoose from 'mongoose';
import { logger } from '../utils/logger';

/**
 * MongoDB 数据库配置
 * 用于图书管理系统的数据库连接
 */

// MongoDB 连接配置
const MONGODB_URI = process.env.MONGODB_URI || 'mongodb://localhost:27017/library_system';

// 连接选项配置
const mongooseOptions = {
  // 使用新的 URL 解析器
  // useNewUrlParser: true, // mongoose 6+ 默认启用
  // useUnifiedTopology: true, // mongoose 6+ 默认启用
  
  // 连接池配置
  maxPoolSize: 10,
  minPoolSize: 5,
  
  // 超时配置
  serverSelectionTimeoutMS: 5000, // 服务器选择超时
  socketTimeoutMS: 45000, // Socket 超时
  
  // 其他配置
  autoIndex: true, // 自动创建索引
};

/**
 * 连接 MongoDB 数据库
 */
export const connectMongoDB = async (): Promise<void> => {
  try {
    // 监听连接事件
    mongoose.connection.on('connected', () => {
      logger.info('MongoDB 连接成功');
      logger.info(`数据库地址: ${MONGODB_URI}`);
    });

    mongoose.connection.on('error', (err) => {
      logger.error('MongoDB 连接错误:', err);
    });

    mongoose.connection.on('disconnected', () => {
      logger.warn('MongoDB 连接断开');
    });

    // 执行连接
    await mongoose.connect(MONGODB_URI, mongooseOptions);
    
    logger.info('MongoDB 数据库初始化完成');
  } catch (error) {
    logger.error('MongoDB 连接失败:', error);
    throw error;
  }
};

/**
 * 断开 MongoDB 连接
 */
export const disconnectMongoDB = async (): Promise<void> => {
  try {
    await mongoose.disconnect();
    logger.info('MongoDB 连接已关闭');
  } catch (error) {
    logger.error('MongoDB 断开连接失败:', error);
    throw error;
  }
};

/**
 * 测试数据库连接
 */
export const testMongoDBConnection = async (): Promise<boolean> => {
  try {
    const adminUtil = mongoose.connection.db?.admin();
    if (!adminUtil) {
      throw new Error('数据库未连接');
    }
    
    const info = await adminUtil.ping();
    logger.info('数据库连接测试成功:', info);
    return true;
  } catch (error) {
    logger.error('数据库连接测试失败:', error);
    return false;
  }
};

export default {
  connectMongoDB,
  disconnectMongoDB,
  testMongoDBConnection,
};
